/*
	路由管理模块，接口
	路由管理模块用于将消息Id与对应的Router方法匹配
	用于管理多个路由
*/

package zserver

import (
	"fmt"
	"zinx/zinterface"
)

type ZMsgHandler struct {
	Apis map[uint32]zinterface.IRouter
}

// 新建方法
func NewMsgHandler() zinterface.IMsgHandler {
	return &ZMsgHandler{
		make(map[uint32]zinterface.IRouter),
	}
}

// 实现IMsgHandler

// 为msgId添加路由
func (zmh *ZMsgHandler) AddRouter(msgId uint32, router zinterface.IRouter) {
	fmt.Println("start addrouter")
	
	// 判断当前msgId是否已经注册
	if _, ok := zmh.Apis[msgId]; ok {
		fmt.Println("addrouter error: msgId already exist")
		return
	}

	zmh.Apis[msgId] = router
}

// 调用路由
func (zmh *ZMsgHandler) DoRouter(request zinterface.IRequest) {
	fmt.Println("start dorouter")

	// 判断msgId是否已经注册
	router, ok := zmh.Apis[request.GetMsgId()]
	if !ok {
		fmt.Println("dorouter error: msgId ", request.GetMsgId(), " not registered. please addrouter first")
		return
	}

	fmt.Println("start handle request")

	// 调用router中前、中、后方法
	router.Handle(request)
	router.PostHandle(request)
	router.PreHandle(request)
}
